home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 November / Macworld (1999-11).dmg / Updaters / WhiteCap 3.0.4 / WhiteCap Source.sit / WhiteCap Source / SJ SDK / VisFrameworkHandlers.c < prev    next >
Text File  |  1999-08-30  |  25KB  |  753 lines

  1.  
  2. /*==========================================================================
  3. ----------------------------------------------------------------------------
  4.                             VisFrameworkHandlers.c
  5.                             version 1.0.0
  6.                             Mike Wright
  7.                             darwin@mbay.net
  8.                             
  9.  Handlers for each of the messages that SoundJam sends to visual plug-ins.
  10.                                 
  11. ----------------------------------------------------------------------------
  12. ============================================================================*/
  13.  
  14.  
  15. #include "Debug.h"
  16. #include "VisFramework.h"
  17. #include "WhiteCap.h"
  18. #include "CEgFileSpec.h"
  19. #include "EgOSUtils.h"
  20.  
  21. /*========================================================================== Functions  */
  22.  
  23.  
  24. /* ————————————————————————— HandleInitializeMessage ——————————————————————————————
  25. Purpose:    Initializes the module. Called on first entry.
  26.             
  27.             Some of the tasks this function should perform are:
  28.                 1. fill in VisHandlerData struct fields from fields in
  29.                    messageInfo->u.initMessage
  30.                 2. preload any resources and move the data into VisHandlerData
  31.                 3. retrieve preferences that were saved in HandleCancelMessage()
  32.                    by calling PlayerGetPluginData()
  33.                 
  34.             Since the plugin must coexist with the SoundJam app, it is important
  35.             to use as little memory as possible, and to try using temporary
  36.             memory for any really large data structures.
  37.             
  38.             It is not a bad idea to fill in small variables and leave the 
  39.             allocation of large handles/pointers to the HandleEnableMessage() 
  40.             function whenever that is possible.
  41.  
  42.             messageInfo is a pointer to a message containing:
  43.                 struct VisualPluginInitMessage 
  44.                 {
  45.                     UInt32                version;                // Input
  46.                     void *                appCookie;                // Input
  47.                     SoundJamProcPtr        playerProc;                // Input
  48.                     OptionBits            options;                // Output
  49.                     void                *refcon;                // Output
  50.                 }
  51. ———————————————————————————————————————————————————————————————————————————————————
  52. Arguments:    messageInfo    -    pointer to a VisualPluginInitMessage struct
  53.             plugInData    -    VisHandlerData struct
  54. ———————————————————————————————————————————————————————————————————————————————————
  55. Returns:    status
  56. ———————————————————————————————————————————————————————————————————————————————————
  57. */
  58. OSStatus HandleInitializeMessage (VisualPluginMessageInfo *messageInfo,VisHandlerData *plugInData)
  59. {
  60.     //VisPluginPrefs        plugInPrefs;    /* stuct for getting our preferences back from SoundJam */
  61.     //UInt32                dataSize;
  62.     OSStatus            status            = noErr;
  63.     
  64.     /* allocate storage for plugInData */
  65.     plugInData = (VisHandlerData *)NewPtrClear(sizeof(VisHandlerData));
  66.     
  67.     /* if NewPtrClear() fails, bail out */
  68.     require_action(plugInData,bail,status = memFullErr;);
  69.     
  70.     /* move messageInfo fields into corresponding plugInData fields */
  71.     plugInData->appCookie = messageInfo->u.initMessage.appCookie;
  72.     plugInData->playerProc = messageInfo->u.initMessage.playerProc;
  73.     plugInData->version = messageInfo->u.initMessage.version;
  74.     
  75.     /* fill in framework-specific fields */
  76.     plugInData->magic = cWhiteCapID;
  77.     plugInData->visEnabled = false;
  78.     plugInData -> mWC = NULL;
  79.     
  80.  
  81.     EgOSUtils::Initialize();
  82.     PixPort::Startup();
  83.  
  84.     long prefDepth = PixPort::sOSDepth;
  85.  
  86.     PlayerSetDefaultWindowSize ( messageInfo->u.initMessage.appCookie, messageInfo->u.initMessage.playerProc,
  87.                                         400,
  88.                                         300,
  89.                                         80,
  90.                                         50,
  91.                                         10000,
  92.                                         10000);
  93.  
  94.     PlayerSetFullScreenOptions ( messageInfo->u.initMessage.appCookie, messageInfo->u.initMessage.playerProc, 0, 32, prefDepth, 640, 480 );
  95.  
  96.     
  97.     /* Stuff plugInData storage into the refcon */
  98.     messageInfo->u.initMessage.refcon = (void *)plugInData;
  99.     
  100. bail:
  101.     
  102.     return status;
  103.     
  104. } /* end HandleInitializeMessage */
  105.  
  106.  
  107. /* ——————————————————————————— HandleCleanupMessage ———————————————————————————————
  108. Purpose:    Disposes of all plugInData handles and pointers.
  109.  
  110.             We set the fields in plugInPrefs to the corresponding fields in
  111.             plugInData and pass plugInPrefs to SoundJam via PlayerSetPluginData().
  112.             These fields are retrieved by HandleInitializeMessage by calling
  113.             PlayerGetPluginData().
  114.             
  115.             If plugInData contained any locally allocated pointers or handles,
  116.             we would dispose them here, but the framework sample has none.
  117.             
  118.             We do dispose plugInData itself.
  119. ———————————————————————————————————————————————————————————————————————————————————
  120. Arguments:    plugInData    -    VisHandlerData struct
  121. ———————————————————————————————————————————————————————————————————————————————————
  122. Returns:    status
  123. ———————————————————————————————————————————————————————————————————————————————————
  124. */
  125. OSStatus HandleCleanupMessage (VisHandlerData *plugInData)
  126. {    
  127.     //VisPluginPrefs        plugInPrefs;    /* stuct for passing our preferences to SoundJam */
  128.     OSStatus            status            = noErr;
  129.         
  130.     /* Make sure it's us! */
  131.     require_action(plugInData,bail,status = paramErr;);
  132.     require_action(plugInData->magic == cWhiteCapID,bail,status = paramErr;);
  133.     
  134.  
  135.     PixPort::Shutdown();
  136.     
  137.     /* dispose of plugInData itself */
  138.     DisposePtr((Ptr)plugInData);
  139.     
  140. bail:
  141.     
  142.     return status;
  143.     
  144. } /*end HandleCleanupMessage */
  145.  
  146.  
  147. #pragma mark -
  148.  
  149. /* ——————————————————————————— HandleEnableMessage ————————————————————————————————
  150. Purpose:    Turns on the module.
  151.             
  152.             This is where you should allocate memory for drawing, including
  153.             GWorldPtrs.
  154. ———————————————————————————————————————————————————————————————————————————————————
  155. Arguments:    plugInData    -    VisHandlerData struct
  156. ———————————————————————————————————————————————————————————————————————————————————
  157. Returns:    status
  158. ———————————————————————————————————————————————————————————————————————————————————
  159. */
  160. OSStatus HandleEnableMessage (VisHandlerData *plugInData)
  161. {
  162.     OSStatus    status    =    noErr;
  163.  
  164.     #pragma unused( plugInData )
  165.     /* allocate your drawing memory here */
  166.     
  167. bail:
  168.  
  169.     return status; /* the framework sample always returns noErr */
  170.     
  171. } /* end HandleEnableMessage */
  172.  
  173.  
  174. /* ——————————————————————————— HandleDisableMessage ———————————————————————————————
  175. Purpose:    Turns off the module.
  176.  
  177.             Disposes of all global VisHandlerData handles and pointers that were
  178.             allocated in HandleEnableMessage().
  179.             
  180.             It is particularly important not to leave memory allocated that will
  181.             be re-allocated at the next call to HandleEnableMessage(), as this
  182.             could quickly grow to a very large memory leak.
  183. ———————————————————————————————————————————————————————————————————————————————————
  184. Arguments:    plugInData    -    VisHandlerData struct
  185. ———————————————————————————————————————————————————————————————————————————————————
  186. Returns:    status
  187. ———————————————————————————————————————————————————————————————————————————————————
  188. */
  189. OSStatus HandleDisableMessage (VisHandlerData *plugInData)
  190. {    
  191.     OSStatus    status    = noErr;
  192.         
  193.     #pragma unused( plugInData )
  194.     
  195.     /* dispose memory allocated in HandleEnableMessage() here */
  196.  
  197.     return status; /* the framework sample always returns noErr */
  198.     
  199. } /* end HandleDisableMessage */
  200.  
  201.  
  202. #pragma mark -
  203.  
  204.  
  205. /* ————————————————————————— HandleShowWindowMessage ——————————————————————————————
  206. Purpose:    Window is visible. Get the current port and drawing rectangle from
  207.             messageInfo. We also set visEnabled to true.
  208.             
  209.             messageInfo is a pointer to a message containing:
  210.                 VisualPluginShowWindowMessage 
  211.                 {
  212.                     CGrafPtr                    port;
  213.                     Rect                        drawRect;
  214.                 }
  215. ———————————————————————————————————————————————————————————————————————————————————
  216. Arguments:    messageInfo    -    pointer to a VisualPluginShowWindowMessage struct
  217.             plugInData    -    VisHandlerData struct
  218. ———————————————————————————————————————————————————————————————————————————————————
  219. Returns:    status
  220. ———————————————————————————————————————————————————————————————————————————————————
  221. */
  222. OSStatus HandleShowWindowMessage (VisualPluginMessageInfo *messageInfo, VisHandlerData *plugInData)
  223. {
  224.     OSStatus    status    =    noErr;
  225.  
  226.     plugInData->visEnabled = true;
  227.     
  228.     /* move messageInfo fields into corresponding plugInData fields */
  229.     plugInData->port = messageInfo->u.showWindowMessage.port;
  230.     plugInData->drawRect = messageInfo->u.showWindowMessage.drawRect;
  231.  
  232.     
  233.     if ( ! plugInData -> mWC ) {        
  234.         CEgFileSpec folder;
  235.         folder.AssignFolder( "WhiteCap Configs" );
  236.         plugInData -> mWC = new WhiteCap( folder, plugInData );
  237.         plugInData -> mWC -> SetPort( (GrafPtr) plugInData->port, plugInData->drawRect, ((messageInfo->u.showWindowMessage.options & kWindowIsFullScreen) != 0) );
  238.     }
  239.  
  240.  
  241.  
  242. bail:
  243.  
  244.     return status; /* the framework sample always returns noErr */
  245.     
  246. } /* end HandleShowWindowMessage */
  247.  
  248.  
  249.  
  250. /* ————————————————————————— HandleSetWindowMessage ——————————————————————————————
  251. Purpose:    Window dimensions and/or port have changed.  This is called on behalf
  252.             of window resizing and fullscreen toggles.  If this call returns an
  253.             error, the app will do a hide/show combination instead.
  254. ———————————————————————————————————————————————————————————————————————————————————
  255. Arguments:    plugInData    -    VisHandlerData struct
  256. ———————————————————————————————————————————————————————————————————————————————————
  257. Returns:    status
  258. ———————————————————————————————————————————————————————————————————————————————————
  259. */
  260. OSStatus HandleSetWindowMessage (VisualPluginMessageInfo *messageInfo, VisHandlerData *plugInData)
  261. {
  262.     /* move messageInfo fields into corresponding plugInData fields */
  263.     plugInData->port        = messageInfo->u.setWindowMessage.port;
  264.     plugInData->drawRect    = messageInfo->u.setWindowMessage.drawRect;
  265.     
  266.     if ( plugInData -> mWC ) {
  267.         plugInData -> mWC -> SetPort( (GrafPtr) plugInData->port, plugInData->drawRect, ((messageInfo->u.setWindowMessage.options & kWindowIsFullScreen) != 0));
  268.     }
  269.     
  270.     return noErr;
  271. }
  272.  
  273.  
  274.  
  275. /* ————————————————————————— HandleHideWindowMessage ——————————————————————————————
  276. Purpose:    Window is hidden. We set visEnabled to false.
  277.  
  278. ———————————————————————————————————————————————————————————————————————————————————
  279. Arguments:    plugInData    -    VisHandlerData struct
  280. ———————————————————————————————————————————————————————————————————————————————————
  281. Returns:    status
  282. ———————————————————————————————————————————————————————————————————————————————————
  283. */
  284. OSStatus HandleHideWindowMessage (VisHandlerData *plugInData)
  285. {
  286.     OSStatus    status    =    noErr;
  287.  
  288.     plugInData->visEnabled = false;
  289.     
  290.     if ( plugInData -> mWC ) {
  291.         delete plugInData -> mWC;
  292.         plugInData -> mWC = NULL;
  293.     }
  294.     
  295. bail:
  296.  
  297.     return status; /* the framework sample always returns noErr */
  298.     
  299. } /* end HandleHideWindowMessage */
  300.  
  301.  
  302. #pragma mark -
  303.  
  304.  
  305. /* ——————————————————————————— HandleResizeMessage ————————————————————————————————
  306. Purpose:    User has resized the visual plugin window. Look at the desired
  307.             width and height, and pass back a width and height that is suitable
  308.             for your plugin in the approvedWidth and approvedHeight fields of
  309.             messageInfo.
  310.             
  311.             (SJ 1.0.0b11 doesn't handle this yet.)
  312.             
  313.             The framework sample requires a square window, so we set both dimensions
  314.             to the smaller of the two desired dimensions.
  315.  
  316.             messageInfo is a pointer to a message containing:
  317.                 VisualPluginResizeMessage 
  318.                 {
  319.                     SInt16                    desiredWidth;            // Input
  320.                     SInt16                    desiredHeight;            // Input
  321.                     SInt16                    approvedWidth;            // Output
  322.                     SInt16                    approvedHeight;            // Output
  323.                 }
  324. ———————————————————————————————————————————————————————————————————————————————————
  325. Arguments:    messageInfo    -    pointer to a VisualPluginResizeMessage struct
  326.             plugInData    -    VisHandlerData struct
  327. ———————————————————————————————————————————————————————————————————————————————————
  328. Returns:    status
  329. ———————————————————————————————————————————————————————————————————————————————————
  330. */
  331. OSStatus HandleResizeMessage (VisualPluginMessageInfo *messageInfo,VisHandlerData *plugInData)
  332. {
  333.  
  334.     messageInfo->u.resizeMessage.approvedWidth    = messageInfo->u.resizeMessage.desiredWidth;
  335.     messageInfo->u.resizeMessage.approvedHeight    = messageInfo->u.resizeMessage.desiredHeight;
  336.  
  337.     #pragma unused( plugInData )
  338.  
  339.     return noErr;
  340.     
  341. } /* end HandleResizeMessage */
  342.  
  343.  
  344. #pragma mark -
  345.  
  346.  
  347. /* ———————————————————————————— HandlePlayMessage ————————————————————————————————
  348. Purpose:    Handles new track info.
  349.  
  350.             messageInfo is a pointer to a message containing:
  351.                 struct VisualPluginPlayMessage 
  352.                 {
  353.                     TrackSpec            *trackSpec;        // Input--don't cache, copy out data only valid during call
  354.                     SInt32                volume;            // Input
  355.                     UInt32                bitRate;        // Input
  356.                     SoundComponentData    soundFormat;    // Input
  357.                 }
  358. ———————————————————————————————————————————————————————————————————————————————————
  359. Arguments:    messageInfo    -    pointer to a VisualPluginPlayMessage struct
  360.             plugInData    -    VisHandlerData struct
  361. ———————————————————————————————————————————————————————————————————————————————————
  362. Returns:    status
  363. ———————————————————————————————————————————————————————————————————————————————————
  364. */
  365. OSStatus HandlePlayMessage (VisualPluginMessageInfo *messageInfo,VisHandlerData *plugInData)
  366. {    
  367.     OSStatus    status    =    noErr;
  368.     
  369.     /* move messageInfo fields into corresponding plugInData fields */
  370.     plugInData->trackSpec = messageInfo->u.playMessage.trackSpec;
  371.     plugInData->volume = messageInfo->u.playMessage.volume;
  372.     plugInData->bitRate = messageInfo->u.playMessage.bitRate;
  373.     BlockMoveData((Ptr)&messageInfo->u.playMessage.soundFormat,(Ptr)&plugInData->soundFormat,sizeof(SoundComponentData));
  374.  
  375.     /* the framework sample just erases the display */
  376.     //ResetVisual(plugInData);
  377.     
  378.     
  379.     return status; /* the framework sample always returns noErr */
  380.     
  381. } /* end HandlePlayMessage */
  382.  
  383.  
  384. /* ———————————————————————————— HandleStopMessage —————————————————————————————————
  385. Purpose:    Responds to the stopping of the current track.
  386. ———————————————————————————————————————————————————————————————————————————————————
  387. Arguments:    plugInData    -    VisHandlerData struct
  388. ———————————————————————————————————————————————————————————————————————————————————
  389. Returns:    status
  390. ———————————————————————————————————————————————————————————————————————————————————
  391. */
  392. OSStatus HandleStopMessage ( VisHandlerData *plugInData)
  393. {    
  394.     OSStatus    status    =    noErr;
  395.     
  396.     for ( int i = 0; i < NUM_SAMPLE_BINS; i++ ) {
  397.         plugInData -> mSample[ i ] = 0; 
  398.     } 
  399.     
  400.     
  401.     return status; /* the framework sample always returns noErr */
  402.     
  403. } /* end HandleStopMessage */
  404.  
  405.  
  406. #pragma mark -
  407.  
  408.  
  409. /* ——————————————————————————— HandlePauseMessage —————————————————————————————————
  410. Purpose:    Responds to the pausing of the current track by setting 
  411.             plugInData->visEnabled = false, which will prevent any modification
  412.             of the module window.
  413. ———————————————————————————————————————————————————————————————————————————————————
  414. Arguments:    plugInData    -    VisHandlerData struct
  415. ———————————————————————————————————————————————————————————————————————————————————
  416. Returns:    status
  417. ———————————————————————————————————————————————————————————————————————————————————
  418. */
  419. OSStatus HandlePauseMessage ( VisHandlerData *plugInData)
  420. {    
  421.     OSStatus    status    =    noErr;
  422.     
  423.     #pragma unused( plugInData )
  424.     
  425.     return status; /* the framework sample always returns noErr */
  426.     
  427. } /* end HandlePauseMessage */
  428.  
  429.  
  430. /* —————————————————————————— HandleUnpauseMessage ————————————————————————————————
  431. Purpose:    Responds to the unpausing of the current trackby setting 
  432.             plugInData->visEnabled = true, which will permit the modification
  433.             of the module window.
  434. ———————————————————————————————————————————————————————————————————————————————————
  435. Arguments:    plugInData    -    VisHandlerData struct
  436. ———————————————————————————————————————————————————————————————————————————————————
  437. Returns:    status
  438. ———————————————————————————————————————————————————————————————————————————————————
  439. */
  440. OSStatus HandleUnpauseMessage ( VisHandlerData *plugInData)
  441. {    
  442.     OSStatus    status    =    noErr;
  443.     
  444.     #pragma unused( plugInData )
  445.     
  446.     return status; /* the framework sample always returns noErr */
  447.     
  448. } /* end HandleUnpauseMessage */
  449.  
  450.  
  451. #pragma mark -
  452.  
  453.  
  454. /* ——————————————————————————— HandleRenderMessage ————————————————————————————————
  455. Purpose:    Renders some data visually.
  456.  
  457.             messageInfo is a pointer to a message containing:
  458.                 struct VisualPluginRenderMessage 
  459.                 {
  460.                     RenderVisualData        *renderData;
  461.                 }
  462. ———————————————————————————————————————————————————————————————————————————————————
  463. Arguments:    messageInfo    -    pointer to a VisualPluginRenderMessage struct
  464.             plugInData    -    VisHandlerData struct
  465. ———————————————————————————————————————————————————————————————————————————————————
  466. Returns:    status
  467. ———————————————————————————————————————————————————————————————————————————————————
  468. */
  469. OSStatus HandleRenderMessage (VisualPluginMessageInfo *messageInfo,VisHandlerData *plugInData)
  470. {
  471.     OSStatus    status    =    noErr;
  472.     
  473.     /* For the framework sample module, we're just getting the first 256    */
  474.     /* bytes of spectrumData. You may want to get all of renderData            */
  475.         
  476.     //BlockMoveData(&messageInfo->u.renderMessage.renderData,&plugInData->renderData,sizeof(RenderVisualData));
  477.     
  478.  
  479.     /* if we're not enabled, we don't draw */
  480.     if ( plugInData->visEnabled || 1  ) {
  481.     
  482.     
  483.              
  484.      
  485.      // ##############
  486.      
  487.      
  488.          int i, j;
  489.         
  490.         /*
  491.         gPlugInfo.ma->GetFFT( &samp, &fftNum );
  492.  
  493.         if ( gPlugInfo.ma->GetStatus )
  494.             gPlugInfo.ma->GetStatus( &time, &status );
  495.  
  496.         if ( fftNum < NUM_SAMPLE_BINS * 11 + 10 || ( status & statusStopped ) ) {
  497.             for ( i = 0; i < NUM_SAMPLE_BINS; i++ ) {
  498.                 plugInData -> mSample[ i ] = 0; 
  499.             } 
  500.               }
  501.         else {
  502.         
  503.             bin = 10;
  504.             for ( i = 0; i < NUM_SAMPLE_BINS; i++ ) {
  505.                 gSample[ i ] = 0;
  506.                 for ( j = 0; j < 11; j++, bin++ ) 
  507.                     gSample[ i ] += samp[ bin ];
  508.             }
  509.             
  510.             bin = 10;
  511.             for ( i = 0; i < NUM_SAMPLE_BINS; i++ ) {
  512.                 for ( j = 0; j < 11; j++, bin++ ) 
  513.                     gSample[ i ] += samp[ bin ];
  514.     //            gSample[ i ] = .03 * .0003 * gSample[ i ] * (0.85 + .059 * i);
  515.     //            gSample[ i ] = .1 * ( sqrt( 15 + .0003 * gSample[ i ] * (0.85 + .059 * i) ) - sqrt( 15 ) );
  516.                 gSample[ i ] = .13 * ( sqrt( 40 + .0003 * gSample[ i ] * (0.85 + .059 * i) ) - sqrt( 40 ) );
  517.             }
  518.             
  519.             gSample[ 0 ] *= 0.45;
  520.             gSample[ 1 ] *= 0.75;
  521.         }*/
  522.  
  523.     RenderVisualData* data = messageInfo->u.renderMessage.renderData;
  524.  
  525.     float factor, binVal;
  526.     
  527.     long sum, idx = 10;
  528.     for ( i = 0; i < NUM_SAMPLE_BINS; i++ ) {
  529.         sum = 0;
  530.         for ( j = 0; j < 5; j++, idx++ ) 
  531.             sum +=  ((unsigned) data -> spectrumData[0][idx]);
  532.         plugInData -> mSample[ i ] = sum;
  533.     }
  534.     
  535.     idx = 10;
  536.     for ( i = 0; i < NUM_SAMPLE_BINS; i++ ) {
  537.         sum = 0;
  538.         for ( j = 0; j < 5; j++, idx++ ) 
  539.             sum += ((unsigned) data -> spectrumData[1][idx]);
  540.         binVal = ((float) sum + plugInData -> mSample[ i ]) * (0.87 + (float) i / 47.0) / (1400.0);
  541.         factor = .6 + .3 / ( 1.56 * binVal + .5 );
  542.         if ( factor < 1 )
  543.             binVal *= factor;
  544.         plugInData -> mSample[ i ] = UNIV_MAG_SCALE * binVal;
  545.  
  546.     }
  547.     
  548.     plugInData -> mSample[ 0 ] *= 0.45;
  549.     plugInData -> mSample[ 1 ] *= 0.75;
  550.  
  551.         // Store the newest sample and chuck and old samples
  552.         plugInData -> mWC -> RecordSample( EgOSUtils::CurTimeMS(), plugInData -> mSample );
  553.  
  554.         // Update the screen, baby.  Let's shag!
  555.         plugInData -> mWC -> Draw();
  556.  
  557.     }
  558.  
  559.     return status;
  560.     
  561. } /* end HandleRenderMessage */
  562.  
  563.  
  564. #pragma mark -
  565.  
  566.  
  567. /* ——————————————————————— HandleProcessSamplesMessage ————————————————————————————
  568. Purpose:    Processes sound data.
  569.  
  570.             You may modify the sound data in *sampleBuffer, but its size must
  571.             not be increased beyond the value in maxSamples, which indicates the
  572.             maximum available buffer space.
  573.  
  574.             messageInfo is a pointer to a message containing:
  575.             struct VisualPluginProcessSamplesMessage 
  576.             {
  577.                 UInt32        timeStampID;            // Input
  578.                 SInt16        *sampleBuffer;            // Input
  579.                 UInt32        numSamples;                // Input
  580.                 UInt32        maxSamples;                // Input
  581.                 UInt32        numOutputSamples;        // Output (must be <= maxSamples)
  582.             }
  583. ———————————————————————————————————————————————————————————————————————————————————
  584. Arguments:    messageInfo    -    pointer to a VisualPluginProcessSamplesMessage struct
  585.             plugInData    -    VisHandlerData struct
  586. ———————————————————————————————————————————————————————————————————————————————————
  587. Returns:    status
  588. ———————————————————————————————————————————————————————————————————————————————————
  589. */
  590. OSStatus HandleProcessSamplesMessage (VisualPluginMessageInfo *messageInfo,VisHandlerData *plugInData)
  591. {
  592.     OSStatus    status    =    noErr;
  593.     
  594.     /* move messageInfo fields into corresponding plugInData fields */
  595.     plugInData->timeStampID = messageInfo->u.processSamplesMessage.timeStampID;
  596.     plugInData->sampleBuffer = messageInfo->u.processSamplesMessage.sampleBuffer;
  597.     plugInData->numSamples = messageInfo->u.processSamplesMessage.numSamples;
  598.     plugInData->maxSamples = messageInfo->u.processSamplesMessage.maxSamples;
  599.     plugInData->numOutputSamples = messageInfo->u.processSamplesMessage.numSamples; //init to numSamples
  600.     
  601.     /* the framework sample does not actually handle this message */
  602.     
  603.     return status; /* the framework sample always returns noErr */
  604.     
  605. } /* end HandleProcessSamplesMessage */
  606.  
  607.  
  608. /* ———————————————————————— HandleFlushSamplesMessage —————————————————————————————
  609. Purpose:    Sound data is no longer valid. Dispose of your data and prepare to
  610.             receive new data.
  611.  
  612.             Processes sound data.
  613.  
  614. ———————————————————————————————————————————————————————————————————————————————————
  615. Arguments:    plugInData    -    VisHandlerData struct
  616. ———————————————————————————————————————————————————————————————————————————————————
  617. Returns:    status
  618. ———————————————————————————————————————————————————————————————————————————————————
  619. */
  620. OSStatus HandleFlushSamplesMessage (VisHandlerData *plugInData)
  621. {
  622.     OSStatus    status    =    noErr;
  623.     
  624.     /* zero out sound sample */
  625.     plugInData->timeStampID = 0;
  626.     plugInData->sampleBuffer = nil;
  627.     plugInData->numSamples = 0;
  628.     plugInData->maxSamples = 0;
  629.     plugInData->numOutputSamples = 0;
  630.         
  631.     return status; /* the framework sample always returns noErr */
  632.     
  633. } /* end HandleFlushSamplesMessage */
  634.  
  635.  
  636. #pragma mark -
  637.  
  638.  
  639. /* ——————————————————————————— HandleEventMessage ————————_————————————————————————
  640. Purpose:    Handles a Mac event.
  641.             The events will be limited to mouse clicks and keystrokes.
  642.             
  643.             If a keyDown message is not handled, this routine should return
  644.             paramErr or something else other than noErr, in order to avoid
  645.             swallowing unused keystrokes.
  646.             
  647.             messageInfo is a pointer to a message containing:
  648.                 struct VisualPluginEventMessage 
  649.                     {
  650.                         EventRecord        *event;
  651.                     }
  652. ———————————————————————————————————————————————————————————————————————————————————
  653. Arguments:    messageInfo    -    pointer to a VisualPluginEventMessage
  654.             plugInData    -    VisHandlerData struct
  655. ———————————————————————————————————————————————————————————————————————————————————
  656. Returns:    status
  657. ———————————————————————————————————————————————————————————————————————————————————
  658. */
  659. OSStatus HandleEventMessage (VisualPluginMessageInfo *messageInfo,VisHandlerData *plugInData)
  660. {    
  661.     OSStatus    status    =    noErr;
  662.     
  663.     switch (messageInfo->u.eventMessage.event->what)
  664.     {
  665.         case mouseDown:
  666.         HandlePlugInMouseDown(plugInData,messageInfo->u.eventMessage.event);
  667.         break;
  668.         
  669.         case keyDown:
  670.         status = paramErr;
  671.         break;
  672.         
  673.         default:
  674.         break;
  675.     }
  676.     
  677.     return status; /* the framework sample always returns noErr */
  678.     
  679. } /* end HandleEventMessage */
  680.  
  681.  
  682. /* ——————————————————————————— HandleUpdateMessage ————————————————————————————————
  683. Purpose:    Equivalent of a Mac update event.
  684. ———————————————————————————————————————————————————————————————————————————————————
  685. Arguments:    plugInData    -    VisHandlerData struct
  686. ———————————————————————————————————————————————————————————————————————————————————
  687. Returns:    status
  688. ———————————————————————————————————————————————————————————————————————————————————
  689. */
  690. OSStatus HandleUpdateMessage (VisHandlerData *plugInData)
  691. {    
  692.     
  693.     if ( plugInData -> mWC ) {
  694.         plugInData -> mWC -> RefreshRect( (**( plugInData -> port -> visRgn)).rgnBBox );
  695.         plugInData -> mWC -> Draw(); 
  696.     }
  697.     
  698.     return noErr; /* the framework sample always returns noErr */
  699.     
  700. } /* end HandleUpdateMessage */
  701.  
  702.  
  703. /* ————————————————————————————— HandleIdleMessage ————————————————————————————————
  704. Purpose:    Handles idle tasks.    The kVisualPluginIdleMessage will be received
  705.             only if the kVisualWantsIdleMessages bit was set in
  706.             playerMessageInfo.u.registerVisualPluginMessage.options in main().
  707. ———————————————————————————————————————————————————————————————————————————————————
  708. Arguments:    plugInData    -    VisHandlerData struct
  709. ———————————————————————————————————————————————————————————————————————————————————
  710. Returns:    status
  711. ———————————————————————————————————————————————————————————————————————————————————
  712. */
  713. OSStatus HandleIdleMessage (VisHandlerData *plugInData)
  714. {    
  715.     OSStatus    status    =    noErr;
  716.     
  717.     //RenderVisual(plugInData);
  718.     if ( plugInData -> mWC ) {
  719.         plugInData -> mWC -> RecordSample( EgOSUtils::CurTimeMS(), plugInData -> mSample );
  720.         plugInData -> mWC -> Draw();
  721.     }
  722.     
  723.     
  724.     return status; /* the framework sample always returns noErr */
  725.     
  726. } /* end HandleIdleMessage */
  727.  
  728.  
  729.  
  730.  
  731.  
  732.  
  733. void HandlePlugInMouseDown (VisHandlerData *plugInData,EventRecord *theEvent)
  734. {
  735. /*
  736.     MenuHandle    thePopUp;
  737.     SInt32        menuResult;
  738.     SInt16        theItem;*/
  739.     Point        pt = theEvent -> where;
  740.     
  741.     static long sLastWhen = 0;
  742.     long     curTime = ::TickCount();
  743.  
  744.     if ( plugInData -> mWC -> PtInTitle( pt ) || ( theEvent -> modifiers & cmdKey ) )
  745.         plugInData -> mWC -> SelectConfig();
  746. //    else if ( plugInData -> mWC -> IsAtFullScreen() )
  747. //        plugInData -> mWC -> SetFullScreen( false );
  748.     else if ( curTime - sLastWhen < ::GetDblTime() ) 
  749.         plugInData -> mWC -> SetFullScreen( true );
  750.     else
  751.         sLastWhen = curTime;
  752. }
  753.